﻿using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using GestionEducativa.Controllers;
using GestionEducativa.DataLayer;

namespace GestionEducativa.Models
{
    public class UsuarioViewModel
    {
        [Required]
        public string Usuario { get; set; }
        [Required]
        public string Contraseña { get; set; }
        public int Rol { get; set; }

        public string NuevaContraseña { get; set; }
        public string ConfirmarContraseña { get; set; }

        public bool Estado { get; set; }
        public int Numeroemp { get; set; }

        //Este metodo se encarga de llamar una consulta en el DataLayer la cual devuelve un usuario
        /// <summary>
        /// Llama a una consulta para obtener un usuario
        /// </summary>
        /// <param name="userName"></param>
        /// <returns>UserClass</returns>
        public UsuarioViewModel ObtenerUsuario(string userName)
        {

            return
                new UsuarioRepository().ObtenerUsuario(userName);
        }
        public UsuarioViewModel ObtenerUsuario(int numemp)
        {

            return
                new UsuarioRepository().ObtenerUsuario(numemp);
        }

        public IEnumerable<Rol> Roles()
        {
            return
                new RolRepository().TraerTodosRol();
        }

        public IEnumerable<string> NumeroEmpleadoU()
        {
            return
                new UsuarioRepository().NumeroEmpleadoU();
        }

        public static string AgregarUsuario(string numeroempleado, string nombreempleado, string contraseña, string rol)
        {
            if (!string.IsNullOrWhiteSpace(numeroempleado) && !string.IsNullOrWhiteSpace(nombreempleado) &&
                !string.IsNullOrWhiteSpace(contraseña) && !string.IsNullOrWhiteSpace(rol))
            {
                UsuarioViewModel usunu = new UsuarioViewModel().ObtenerUsuario(Convert.ToInt32(numeroempleado));
                UsuarioViewModel usuno = new UsuarioViewModel().ObtenerUsuario(nombreempleado);
                Empleados emp = new EmpleadosRepository().TraerEmpleado(Convert.ToInt32(numeroempleado));
                if (emp != null)
                {
                    if (emp.estado)
                    {
                        if (usunu.Numeroemp == 0)
                        {
                            if (usuno.Usuario == null)
                            {
                                contraseña = LoginController.ObtenerHash(contraseña);

                                Usuario user = new Usuario();

                                user.noemp = Convert.ToInt32(numeroempleado);
                                user.usuario = nombreempleado;
                                user.contrasena = contraseña;
                                user.idrol = Convert.ToInt32(rol);
                                user.estado = true;

                                new UsuarioRepository().InsertarUsuario(user);

                                return
                                    "a";
                            }
                            else
                            {
                                return
                                    "enombre";
                            }
                        }
                        else
                        {
                            return
                                "enumero";
                        }
                    }
                    else
                    {
                        return
                        "inactivo";
                    }
                }
                else
                {
                    return
                        "nenumero";
                }
            }
            return
                "v";
        }

        public static DatosViewModel ModificarUsuarioObt(string numeroempleado)
        {
            DatosViewModel dato = new DatosViewModel();

            try
            {
                if (!string.IsNullOrWhiteSpace(numeroempleado))
                {
                    UsuarioViewModel usuario = new UsuarioRepository().ObtenerUsuario(Convert.ToInt32(numeroempleado));

                    dato.usuario = usuario.Usuario;
                    dato.idrol = usuario.Rol;
                    dato.valor = "encontrado";

                    if (dato.usuario == null)
                    {
                        dato.valor = "noexiste";
                    }
                    return
                        dato;
                }
                else
                {
                    dato.valor = "vacio";
                    return
                        dato;
                }
            }
            catch (Exception)
            {
                dato.valor = "e";

                return
                    dato;
            }
        }

        public static string ModificarUsuario(string numeroempleado, string contraseña, string rol)
        {
            try
            {
                if (!string.IsNullOrWhiteSpace(numeroempleado) && !string.IsNullOrWhiteSpace(contraseña)
                    && !string.IsNullOrWhiteSpace(rol))
                {
                    UsuarioViewModel usuario = new UsuarioViewModel().ObtenerUsuario(Convert.ToInt32(numeroempleado));

                    contraseña = LoginController.ObtenerHash(contraseña);

                    Usuario user = new Usuario();

                    user.noemp = Convert.ToInt32(numeroempleado);
                    user.contrasena = contraseña;
                    user.idrol = Convert.ToInt32(rol);

                    new UsuarioRepository().ActualizarUsuario(user);
                    return
                        "a";
                }
                if (!string.IsNullOrWhiteSpace(numeroempleado) && string.IsNullOrWhiteSpace(contraseña)
                    && !string.IsNullOrWhiteSpace(rol))
                {
                    UsuarioViewModel usuario = new UsuarioViewModel().ObtenerUsuario(Convert.ToInt32(numeroempleado));
                    Usuario user = new Usuario();

                    user.noemp = Convert.ToInt32(numeroempleado);
                    user.contrasena = usuario.Contraseña;
                    user.idrol = Convert.ToInt32(rol);

                    new UsuarioRepository().ActualizarUsuario(user);
                    return
                        "a";
                }
                return
                    "v";
            }
            catch (Exception)
            {
                return
                    "e";
            }
        }

        /// <summary>
        /// Deshabilita o habilita el estado de un usuario dependiendo el estado realiza la operación contraria.
        /// </summary>
        /// <param name="numeroempleado"></param>
        public static bool DOHU(int numeroempleado)
        {
            return
                new UsuarioRepository().HabilitacionUsuario(numeroempleado);
        }

        public static void ActualizarUsuario(Usuario user)
        {
            new UsuarioRepository().ActualizarUsuario(user);
        }

        public static Usuario TransformarUMEU(UsuarioViewModel usuario)
        {
            Usuario usuarior = new Usuario();

            usuarior.noemp = usuario.Numeroemp;
            usuarior.idrol = usuario.Rol;
            usuarior.usuario = usuario.Usuario;
            usuarior.contrasena = usuario.Contraseña;
            usuarior.estado = usuario.Estado;

            return
                usuarior;
        }

        public static Empleados TraerEmpleado(int numeroempleado)
        {
            return
                new EmpleadosRepository().TraerEmpleado(numeroempleado);
        }
    }
}